// 反糖 基本原理

function logged(value, context) {
  console.log(context, 'context')
  if (context.kind === 'getter' || context.kind === 'setter') { // 装饰的是访问器
    return function (...args) {
      console.log('重写的逻辑', context.name)
      // 使用 apply 来调用函数 同时指定 this 为调用函数时的对象
      const result = value.apply(this, args)
      return result
    }
  }
}

class C {
  set x(args) { }

  get x() {
    return 2
  }
}

// 获取访问器描述符上的 get 和 set
let { get, set } = Object.getOwnPropertyDescriptor(C.prototype, 'x')
get = logged(get, { kind: 'getter', name: 'x' })
set = logged(set, { kind: 'setter', name: 'x' })

// 重新设置访问器描述符
Object.defineProperty(C.prototype, 'x', { get, set })

let clazz = new C()
clazz.x = 1
console.log(clazz.x)


